﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
using Spring.Core.IO;
using Spring.Util;

namespace Mistral.Web.Services
{
//	public class WebServiceInvoker
//	{
//		public class Param
//		{
//			public string Name;
//			public Type Type;
//		}
//
//		public static object CallMethod( string webServiceUri, string webMethodName, Type returnType, Param[] methodParams, object[] parameters )
//		{
//			// Создание интерфейсного типа описания сервиса
//			Type serviceType = CreateServiceType( webMethodName, returnType, methodParams );
//
//			WebServiceProxyFactory proxyFactory = new WebServiceProxyFactory();
//			proxyFactory.ServiceUri = new UrlResource( webServiceUri );
//			proxyFactory.ServiceInterface = serviceType;
//			object webServiceProxy = proxyFactory.GetObject();
//
//			MethodInfo method = serviceType.GetMethod( webMethodName );
//
//			return method.Invoke( webServiceProxy, parameters );
//		}
//
//		public static Type CreateServiceType( string webMethodName, Type returnType, Param[] methodParams )
//		{
//			string assemblyName = "Billings.Proxies";
//			ModuleBuilder moduleBuilder = DynamicCodeManager.GetModuleBuilder( assemblyName);
//
//			TypeAttributes typeAttributes = TypeAttributes.Public | TypeAttributes.Interface | TypeAttributes.Abstract;
//			MethodAttributes methodAttributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Abstract | MethodAttributes.Virtual;
//
//			string typeName = "IWebServiceProxy_"+Guid.NewGuid().ToString("N");
//
//			// Построитель типа для IWebServiceProxy
//			TypeBuilder typeBuilder = moduleBuilder.DefineType( typeName, typeAttributes );
//
//		
//			Type[] argTypes = methodParams.Convert( input => input.Type );
//	
//
//			MethodBuilder method = typeBuilder.DefineMethod( webMethodName, methodAttributes, returnType, argTypes );
//
//			for ( int i = 1; i <= methodParams.Length; i++ )
//			{
//				method.DefineParameter( i, ParameterAttributes.None, methodParams[i].Name );
//			}
//
//			
//			Type serviceType = typeBuilder.CreateType();
//			DynamicCodeManager.SaveAssembly( assemblyName );
//			return serviceType;
//		}
//	}
}
